Utility functions for multi-screen applications which need to ensure
authorMark McLoughlin <mark@skynet.ie>
Wed, 10 Dec 2003 13:49:58 +0000 (13:49 +0000)
committerMark McLoughlin <markmc@src.gnome.org>
Wed, 10 Dec 2003 13:49:58 +0000 (13:49 +0000)
2003-12-10  Mark McLoughlin  <mark@skynet.ie>

        Utility functions for multi-screen applications which need
        to ensure launched applications appear on a certain screen.
        See bug #95897.

        * gdk/gdkspawn.h: header for multi-screen launching
        support.

        * gdk/Makefile.am: install gdkspawn.h.

        * gdk/x11/Makefile.am:
        * gdk/x11/gdkspawn-x11.c:
        (gdk_spawn_make_environment_for_screen): private function
        to create an environment vector with DISPLAY set appropriately
        for the screen.
        (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
        (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
        (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().

        * gdk/linux-fb/Makefile.am,
          gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.

        * gdk/win32/Makefile.am,
          gdk/win32/gdkspawn-win32.c: win32 impl.

13 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/Makefile.am
gdk/gdkspawn.h [new file with mode: 0644]
gdk/linux-fb/Makefile.am
gdk/linux-fb/gdkspawn-fb.c [new file with mode: 0644]
gdk/win32/Makefile.am
gdk/win32/gdkspawn-win32.c [new file with mode: 0644]
gdk/x11/Makefile.am
gdk/x11/gdkspawn-x11.c [new file with mode: 0644]

index 7b4735dbf9bd00c2855647f6ddb7187928fc704c..82a5eb01deb602c81e75c8a9c70b4854663111da 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2003-12-10  Mark McLoughlin  <mark@skynet.ie>
+
+       Utility functions for multi-screen applications which need
+       to ensure launched applications appear on a certain screen.
+       See bug #95897.
+       
+       * gdk/gdkspawn.h: header for multi-screen launching
+       support.
+       
+       * gdk/Makefile.am: install gdkspawn.h.
+       
+       * gdk/x11/Makefile.am:
+       * gdk/x11/gdkspawn-x11.c:
+       (gdk_spawn_make_environment_for_screen): private function
+       to create an environment vector with DISPLAY set appropriately
+       for the screen.
+       (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
+       (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
+       (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().
+       
+       * gdk/linux-fb/Makefile.am,
+         gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.
+       
+       * gdk/win32/Makefile.am,
+         gdk/win32/gdkspawn-win32.c: win32 impl.
+
 2003-12-09  Federico Mena Quintero  <federico@ximian.com>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home"
index 7b4735dbf9bd00c2855647f6ddb7187928fc704c..82a5eb01deb602c81e75c8a9c70b4854663111da 100644 (file)
@@ -1,3 +1,29 @@
+2003-12-10  Mark McLoughlin  <mark@skynet.ie>
+
+       Utility functions for multi-screen applications which need
+       to ensure launched applications appear on a certain screen.
+       See bug #95897.
+       
+       * gdk/gdkspawn.h: header for multi-screen launching
+       support.
+       
+       * gdk/Makefile.am: install gdkspawn.h.
+       
+       * gdk/x11/Makefile.am:
+       * gdk/x11/gdkspawn-x11.c:
+       (gdk_spawn_make_environment_for_screen): private function
+       to create an environment vector with DISPLAY set appropriately
+       for the screen.
+       (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
+       (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
+       (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().
+       
+       * gdk/linux-fb/Makefile.am,
+         gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.
+       
+       * gdk/win32/Makefile.am,
+         gdk/win32/gdkspawn-win32.c: win32 impl.
+
 2003-12-09  Federico Mena Quintero  <federico@ximian.com>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home"
index 7b4735dbf9bd00c2855647f6ddb7187928fc704c..82a5eb01deb602c81e75c8a9c70b4854663111da 100644 (file)
@@ -1,3 +1,29 @@
+2003-12-10  Mark McLoughlin  <mark@skynet.ie>
+
+       Utility functions for multi-screen applications which need
+       to ensure launched applications appear on a certain screen.
+       See bug #95897.
+       
+       * gdk/gdkspawn.h: header for multi-screen launching
+       support.
+       
+       * gdk/Makefile.am: install gdkspawn.h.
+       
+       * gdk/x11/Makefile.am:
+       * gdk/x11/gdkspawn-x11.c:
+       (gdk_spawn_make_environment_for_screen): private function
+       to create an environment vector with DISPLAY set appropriately
+       for the screen.
+       (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
+       (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
+       (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().
+       
+       * gdk/linux-fb/Makefile.am,
+         gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.
+       
+       * gdk/win32/Makefile.am,
+         gdk/win32/gdkspawn-win32.c: win32 impl.
+
 2003-12-09  Federico Mena Quintero  <federico@ximian.com>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home"
index 7b4735dbf9bd00c2855647f6ddb7187928fc704c..82a5eb01deb602c81e75c8a9c70b4854663111da 100644 (file)
@@ -1,3 +1,29 @@
+2003-12-10  Mark McLoughlin  <mark@skynet.ie>
+
+       Utility functions for multi-screen applications which need
+       to ensure launched applications appear on a certain screen.
+       See bug #95897.
+       
+       * gdk/gdkspawn.h: header for multi-screen launching
+       support.
+       
+       * gdk/Makefile.am: install gdkspawn.h.
+       
+       * gdk/x11/Makefile.am:
+       * gdk/x11/gdkspawn-x11.c:
+       (gdk_spawn_make_environment_for_screen): private function
+       to create an environment vector with DISPLAY set appropriately
+       for the screen.
+       (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
+       (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
+       (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().
+       
+       * gdk/linux-fb/Makefile.am,
+         gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.
+       
+       * gdk/win32/Makefile.am,
+         gdk/win32/gdkspawn-win32.c: win32 impl.
+
 2003-12-09  Federico Mena Quintero  <federico@ximian.com>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home"
index 7b4735dbf9bd00c2855647f6ddb7187928fc704c..82a5eb01deb602c81e75c8a9c70b4854663111da 100644 (file)
@@ -1,3 +1,29 @@
+2003-12-10  Mark McLoughlin  <mark@skynet.ie>
+
+       Utility functions for multi-screen applications which need
+       to ensure launched applications appear on a certain screen.
+       See bug #95897.
+       
+       * gdk/gdkspawn.h: header for multi-screen launching
+       support.
+       
+       * gdk/Makefile.am: install gdkspawn.h.
+       
+       * gdk/x11/Makefile.am:
+       * gdk/x11/gdkspawn-x11.c:
+       (gdk_spawn_make_environment_for_screen): private function
+       to create an environment vector with DISPLAY set appropriately
+       for the screen.
+       (gdk_spawn_on_screen): multi-screen version of g_spawn_async().
+       (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes().
+       (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async().
+       
+       * gdk/linux-fb/Makefile.am,
+         gdk/linux-fb/gdkspawn-fb.c: linux-fb impl.
+       
+       * gdk/win32/Makefile.am,
+         gdk/win32/gdkspawn-win32.c: win32 impl.
+
 2003-12-09  Federico Mena Quintero  <federico@ximian.com>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home"
index bfe5fe6d61c129933a442d3718a9b413a12232be..29cfbcc46d29742682795fd850e7c30fbb50c231 100644 (file)
@@ -69,6 +69,7 @@ gdk_public_h_sources =                                \
        gdkrgb.h                                \
        gdkscreen.h                             \
        gdkselection.h                          \
+       gdkspawn.h                              \
        gdktypes.h                              \
        gdkvisual.h                             \
        gdkwindow.h
diff --git a/gdk/gdkspawn.h b/gdk/gdkspawn.h
new file mode 100644 (file)
index 0000000..7290101
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __GDK_SPAWN_H__
+#define __GDK_SPAWN_H__
+
+#include <gdk/gdkscreen.h>
+#include <glib/gspawn.h>
+
+G_BEGIN_DECLS
+
+gboolean gdk_spawn_on_screen              (GdkScreen             *screen,
+                                          const gchar           *working_directory,
+                                          gchar                **argv,
+                                          gchar                **envp,
+                                          GSpawnFlags            flags,
+                                          GSpawnChildSetupFunc   child_setup,
+                                          gpointer               user_data,
+                                          gint                  *child_pid,
+                                          GError               **error);
+
+gboolean gdk_spawn_on_screen_with_pipes   (GdkScreen             *screen,
+                                          const gchar           *working_directory,
+                                          gchar                **argv,
+                                          gchar                **envp,
+                                          GSpawnFlags            flags,
+                                          GSpawnChildSetupFunc   child_setup,
+                                          gpointer               user_data,
+                                          gint                  *child_pid,
+                                          gint                  *standard_input,
+                                          gint                  *standard_output,
+                                          gint                  *standard_error,
+                                          GError               **error);
+
+gboolean gdk_spawn_command_line_on_screen (GdkScreen             *screen,
+                                          const gchar           *command_line,
+                                          GError               **error);
+
+G_END_DECLS
+
+#endif /* __GDK_SPAWN_H__ */
index be1c16b70f67940860a618ec25a06a6806eea271..2287c33a8f450b68b3e97e5461a5e854d30ba0d1 100644 (file)
@@ -51,6 +51,7 @@ libgdk_linux_fb_la_SOURCES =    \
        gdkrender-fb.c          \
        gdkscreen-fb.c          \
        gdkselection-fb.c       \
+       gdkspawn-fb.c           \
        gdkvisual-fb.c          \
        gdkwindow-fb.c          \
        mi.h                    \
diff --git a/gdk/linux-fb/gdkspawn-fb.c b/gdk/linux-fb/gdkspawn-fb.c
new file mode 100644 (file)
index 0000000..e00b497
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "gdkspawn.h"
+
+#include <glib.h>
+#include <gdk/gdk.h>
+
+gboolean
+gdk_spawn_on_screen (GdkScreen             *screen,
+                    const gchar           *working_directory,
+                    gchar                **argv,
+                    gchar                **envp,
+                    GSpawnFlags            flags,
+                    GSpawnChildSetupFunc   child_setup,
+                    gpointer               user_data,
+                    gint                  *child_pid,
+                    GError               **error)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  return g_spawn_async (working_directory,
+                       argv,
+                       envp,
+                       flags,
+                       child_setup,
+                       user_data,
+                       child_pid,
+                       error);
+}
+
+gboolean
+gdk_spawn_on_screen_with_pipes (GdkScreen            *screen,
+                               const gchar          *working_directory,
+                               gchar               **argv,
+                               gchar               **envp,
+                               GSpawnFlags           flags,
+                               GSpawnChildSetupFunc  child_setup,
+                               gpointer              user_data,
+                               gint                 *child_pid,
+                               gint                 *standard_input,
+                               gint                 *standard_output,
+                               gint                 *standard_error,
+                               GError              **error)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  return g_spawn_async_with_pipes (working_directory,
+                                  argv,
+                                  envp,
+                                  flags,
+                                  child_setup,
+                                  user_data,
+                                  child_pid,
+                                  standard_input,
+                                  standard_output,
+                                  standard_error,
+                                  error);
+}
+
+gboolean
+gdk_spawn_command_line_on_screen (GdkScreen    *screen,
+                                 const gchar  *command_line,
+                                 GError      **error)
+{
+  gchar    **argv = NULL;
+  gboolean   retval;
+
+  g_return_val_if_fail (command_line != NULL, FALSE);
+
+  if (!g_shell_parse_argv (command_line,
+                          NULL, &argv,
+                          error))
+    return FALSE;
+
+  retval = gdk_spawn (screen,
+                     NULL, argv, NULL,
+                     G_SPAWN_SEARCH_PATH,
+                     NULL, NULL, NULL,
+                     error);
+  g_strfreev (argv);
+
+  return retval;
+}
index 9e11c20949b8ed17e23f8216c271f5b0cbe639b7..213fb20f3f1e8d1294ffa4782a33d9c7c8c8ff91 100644 (file)
@@ -68,6 +68,7 @@ libgdk_win32_la_SOURCES = \
        gdkproperty-win32.c \
        gdkscreen-win32.c \
        gdkselection-win32.c \
+       gdkspawn-win32.c \
        gdkvisual-win32.c \
        gdkwin32.h \
        gdkwin32id.c \
diff --git a/gdk/win32/gdkspawn-win32.c b/gdk/win32/gdkspawn-win32.c
new file mode 100644 (file)
index 0000000..e00b497
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "gdkspawn.h"
+
+#include <glib.h>
+#include <gdk/gdk.h>
+
+gboolean
+gdk_spawn_on_screen (GdkScreen             *screen,
+                    const gchar           *working_directory,
+                    gchar                **argv,
+                    gchar                **envp,
+                    GSpawnFlags            flags,
+                    GSpawnChildSetupFunc   child_setup,
+                    gpointer               user_data,
+                    gint                  *child_pid,
+                    GError               **error)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  return g_spawn_async (working_directory,
+                       argv,
+                       envp,
+                       flags,
+                       child_setup,
+                       user_data,
+                       child_pid,
+                       error);
+}
+
+gboolean
+gdk_spawn_on_screen_with_pipes (GdkScreen            *screen,
+                               const gchar          *working_directory,
+                               gchar               **argv,
+                               gchar               **envp,
+                               GSpawnFlags           flags,
+                               GSpawnChildSetupFunc  child_setup,
+                               gpointer              user_data,
+                               gint                 *child_pid,
+                               gint                 *standard_input,
+                               gint                 *standard_output,
+                               gint                 *standard_error,
+                               GError              **error)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  return g_spawn_async_with_pipes (working_directory,
+                                  argv,
+                                  envp,
+                                  flags,
+                                  child_setup,
+                                  user_data,
+                                  child_pid,
+                                  standard_input,
+                                  standard_output,
+                                  standard_error,
+                                  error);
+}
+
+gboolean
+gdk_spawn_command_line_on_screen (GdkScreen    *screen,
+                                 const gchar  *command_line,
+                                 GError      **error)
+{
+  gchar    **argv = NULL;
+  gboolean   retval;
+
+  g_return_val_if_fail (command_line != NULL, FALSE);
+
+  if (!g_shell_parse_argv (command_line,
+                          NULL, &argv,
+                          error))
+    return FALSE;
+
+  retval = gdk_spawn (screen,
+                     NULL, argv, NULL,
+                     G_SPAWN_SEARCH_PATH,
+                     NULL, NULL, NULL,
+                     error);
+  g_strfreev (argv);
+
+  return retval;
+}
index 3fb2f2b1d42650add07b5dfd5ea79a5eb2b71437..d7c529431ca3b73d6ce976b68a7dc7b9da4a8f30 100644 (file)
@@ -46,6 +46,7 @@ libgdk_x11_la_SOURCES =       \
        gdkscreen-x11.c         \
        gdkscreen-x11.h         \
        gdkselection-x11.c      \
+       gdkspawn-x11.c          \
        gdkvisual-x11.c         \
        gdkwindow-x11.c         \
        gdkwindow-x11.h         \
diff --git a/gdk/x11/gdkspawn-x11.c b/gdk/x11/gdkspawn-x11.c
new file mode 100644 (file)
index 0000000..3309c89
--- /dev/null
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+#include <string.h>
+
+#include "gdkspawn.h"
+
+#include <glib.h>
+#include <gdk/gdk.h>
+
+extern char **environ;
+
+/**
+ * gdk_make_spawn_environment_for_screen:
+ * @screen: A #GdkScreen
+ * @envp: program environment to copy, or NULL to use current environment.
+ *
+ * Returns a modified copy of the program environment @envp (or the current
+ * environment if @envp is NULL) with $DISPLAY set such that a launched 
+ * application (which calls gdk_display_open()) inheriting this environment
+ * would have @screen as its default screen..
+ *
+ * Returns: a newly-allocated %NULL-terminated array of strings.
+ *          Use g_strfreev() to free it.
+ **/
+static gchar **
+gdk_spawn_make_environment_for_screen (GdkScreen  *screen,
+                                      gchar     **envp)
+{
+  gchar **retval = NULL;
+  gchar  *display_name;
+  gint    display_index = -1;
+  gint    i, env_len;
+
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  if (envp == NULL)
+    envp = environ;
+
+  for (env_len = 0; envp[env_len]; env_len++)
+    if (strncmp (envp[env_len], "DISPLAY", strlen ("DISPLAY")) == 0)
+      display_index = env_len;
+
+  retval = g_new (char *, env_len + 1);
+  retval[env_len] = NULL;
+
+  display_name = gdk_screen_make_display_name (screen);
+
+  for (i = 0; i < env_len; i++)
+    if (i == display_index)
+      retval[i] = g_strconcat ("DISPLAY=", display_name, NULL);
+    else
+      retval[i] = g_strdup (envp[i]);
+
+  g_assert (i == env_len);
+
+  g_free (display_name);
+
+  return retval;
+}
+
+/**
+ * gdk_spawn_on_screen:
+ * @screen: a #GdkScreen
+ * @working_directory: child's current working directory, or %NULL to inherit parent's
+ * @argv: child's argument vector
+ * @envp: child's environment, or %NULL to inherit parent's
+ * @flags: flags from #GSpawnFlags
+ * @child_setup: function to run in the child just before <function>exec()</function>
+ * @user_data: user data for @child_setup
+ * @child_pid: return location for child process ID, or %NULL
+ * @error: return location for error
+ *
+ * Like g_spawn_async(), except the child process is spawned in such
+ * an environment that on calling gdk_display_open() it would be
+ * returned a #GdkDisplay with @screen as the default screen.
+ *
+ * This is useful for applications which wish to launch an application
+ * on a specific screen.
+ *
+ * Return value: %TRUE on success, %FALSE if error is set
+ **/
+gboolean
+gdk_spawn_on_screen (GdkScreen             *screen,
+                    const gchar           *working_directory,
+                    gchar                **argv,
+                    gchar                **envp,
+                    GSpawnFlags            flags,
+                    GSpawnChildSetupFunc   child_setup,
+                    gpointer               user_data,
+                    gint                  *child_pid,
+                    GError               **error)
+{
+  gchar    **new_envp;
+  gboolean   retval;
+
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  new_envp = gdk_spawn_make_environment_for_screen (screen, envp);
+
+  retval = g_spawn_async (working_directory,
+                         argv,
+                         new_envp,
+                         flags,
+                         child_setup,
+                         user_data,
+                         child_pid,
+                         error);
+
+  g_strfreev (new_envp);
+
+  return retval;
+}
+
+/**
+ * gdk_spawn_on_screen_with_pipes:
+ * @screen: a #GdkScreen
+ * @working_directory: child's current working directory, or %NULL to inherit parent's
+ * @argv: child's argument vector
+ * @envp: child's environment, or %NULL to inherit parent's
+ * @flags: flags from #GSpawnFlags
+ * @child_setup: function to run in the child just before <function>exec()</function>
+ * @user_data: user data for @child_setup
+ * @child_pid: return location for child process ID, or %NULL
+ * @standard_input: return location for file descriptor to write to child's stdin, or %NULL
+ * @standard_output: return location for file descriptor to read child's stdout, or %NULL
+ * @standard_error: return location for file descriptor to read child's stderr, or %NULL
+ * @error: return location for error
+ *
+ * Like g_spawn_async_with_pipes(), except the child process is
+ * spawned in such an environment that on calling gdk_display_open()
+ * it would be returned a #GdkDisplay with @screen as the default
+ * screen.
+ *
+ * This is useful for applications which wish to launch an application
+ * on a specific screen.
+ *
+ * Return value: %TRUE on success, %FALSE if an error was set
+ **/
+gboolean
+gdk_spawn_on_screen_with_pipes (GdkScreen            *screen,
+                               const gchar          *working_directory,
+                               gchar               **argv,
+                               gchar               **envp,
+                               GSpawnFlags           flags,
+                               GSpawnChildSetupFunc  child_setup,
+                               gpointer              user_data,
+                               gint                 *child_pid,
+                               gint                 *standard_input,
+                               gint                 *standard_output,
+                               gint                 *standard_error,
+                               GError              **error)
+{
+  gchar    **new_envp;
+  gboolean   retval;
+
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
+
+  new_envp = gdk_spawn_make_environment_for_screen (screen, envp);
+
+  retval = g_spawn_async_with_pipes (working_directory,
+                                    argv,
+                                    new_envp,
+                                    flags,
+                                    child_setup,
+                                    user_data,
+                                    child_pid,
+                                    standard_input,
+                                    standard_output,
+                                    standard_error,
+                                    error);
+
+  g_strfreev (new_envp);
+
+  return retval;
+}
+
+/**
+ * gdk_spawn_command_line_on_screen:
+ * @screen: a #GdkScreen
+ * @command_line: a command line
+ * @error: return location for errors
+ *
+ * Like g_spawn_command_line_async(), except the child process is
+ * spawned in such an environment that on calling gdk_display_open()
+ * it would be returned a #GdkDisplay with @screen as the default
+ * screen.
+ *
+ * This is useful for applications which wish to launch an application
+ * on a specific screen.
+ *
+ * Return value: %TRUE on success, %FALSE if error is set.
+ **/
+gboolean
+gdk_spawn_command_line_on_screen (GdkScreen    *screen,
+                                 const gchar  *command_line,
+                                 GError      **error)
+{
+  gchar    **argv = NULL;
+  gboolean   retval;
+
+  g_return_val_if_fail (command_line != NULL, FALSE);
+
+  if (!g_shell_parse_argv (command_line,
+                          NULL, &argv,
+                          error))
+    return FALSE;
+
+  retval = gdk_spawn (screen,
+                     NULL, argv, NULL,
+                     G_SPAWN_SEARCH_PATH,
+                     NULL, NULL, NULL,
+                     error);
+  g_strfreev (argv);
+
+  return retval;
+}